// @ts-ignore
import axios from 'axios';
import { message } from 'antd';
import nprogress from 'nprogress';
import 'nprogress/nprogress.css';
import jsonBig from 'json-bigint';
import { BASEURL, TIMEOUT } from './config';

// 默认的全局配置
const instance = axios.create({
  baseURL: BASEURL,
  timeout: TIMEOUT,
  // transformResponse 允许自定义原始的响应数据（字符串）
  transformResponse: [
    function (data) {
      try {
        // 如果转换成功则返回转换的数据结果
        return jsonBig.parse(data);
      } catch (err) {
        // 如果转换失败，则包装为统一数据格式并返回
        return {
          data
        };
      }
    }
  ]
});

// 配置拦截器
instance.interceptors.request.use(
  (/** @type {any} */ config) => {
    // 请求时开启loading
    nprogress.start();
    // 鉴权 请求没有带token 则重定向到登录页

    // params/data序列化操作

    return config;
  },
  (/** @type {any} */ err) => {
    // 提示错误信息
    message.error('请求超时');

    return Promise.resolve(err);
  }
);
instance.interceptors.response.use(
  (/** @type {{ data: any; }} */ res) => {
    // 关闭loading
    nprogress.done();
    return res.data;
  },
  (/** @type {{ response: { status: any; }; message: string; }} */ err) => {
    if (err && err.response) {
      switch (err.response.status) {
        case 400:
          err.message = '请求错误';
          break;
        case 401:
          err.message = '未授权访问';
          break;
        case 403:
          err.message = '权限不足';
          break;
        case 404:
          err.message = '页面被吃了⊙﹏⊙';
          break;
        case 504:
          err.message = '服务器被吃了⊙﹏⊙';
          break;
        default:
          err.message = '未知错误';
      }
    }
    // 提示错误信息
    message.error(err.message);

    return Promise.resolve(err);
  }
);

export default instance;
